Skip to content

appstore: tombstone + deprecation redirect for io.pilot.smolmachines → io.pilot.smol#357

Closed
Alexgodoroja wants to merge 2 commits into
mainfrom
feat/app-rename-redirect-smol
Closed

appstore: tombstone + deprecation redirect for io.pilot.smolmachines → io.pilot.smol#357
Alexgodoroja wants to merge 2 commits into
mainfrom
feat/app-rename-redirect-smol

Conversation

@Alexgodoroja

@Alexgodoroja Alexgodoroja commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Removes io.pilot.smolmachines from the catalogue and redirects it to io.pilot.smol (the rename + cloud upgrade), without breaking existing installs. Pairs with the website change (pilot-protocol/website#74).

Why not a hard delete

The daemon supervisor pins each installed app's publisher key from its catalogue.json entry and fail-closes (stops) an installed app whose id has no pin (cmd/daemon/main.gointernal/catalogue). A hard delete of io.pilot.smolmachines would therefore stop every already-installed copy — exactly the "installed clients break" objection that closed website#74. So the old id stays as a hidden tombstone that preserves the pin and redirects.

Catalogue

  • catalogue.json: the io.pilot.smolmachines entry is replaced by a minimal tombstone — id + publisher retained (existing installs keep their pin and keep running), plus renamed_to: io.pilot.smol and hidden: true. Bundle/metadata pins dropped: it is no longer installable.
  • catalogue.json.sig: re-signed with the release key — the signed-catalogue test and full cmd/pilotctl suite are green. ✅
  • Deleted catalogue/apps/io.pilot.smolmachines/ (io.pilot.smol carries the app).
  • catalogue/README.md: documents the new renamed_to + hidden fields and the rename procedure.

pilotctl (cmd/pilotctl)

  • catalogueEntry gains optional renamed_to + hidden (omitempty; v2-compatible — older clients ignore them, keep "version": 2).
  • resolveRenamed() — shared one-hop resolver that prints a deprecation warning to stderr and returns the canonical entry. Wired into:
    • install → installs the canonical app;
    • view → shows the renamed app;
    • call → on a socket miss, warns with a switch hint (does not silently retarget — the method namespace changes with the rename, smolmachines.*smol.*);
    • catalogue listing → tombstone/hidden entries omitted (human + --json).
  • appstore_rename_test.go — tombstone→canonical, plain id, missing canonical, and one-hop-only (no loop).

Verification (end-to-end, against the re-signed catalogue)

  • appstore cataloguesmolmachines not listed, io.pilot.smol listed.
  • appstore view io.pilot.smolmachines → deprecation warning + renders the io.pilot.smol detail.
  • appstore install io.pilot.smolmachines → warning + fetched the /bundles/io.pilot.smol/1.2.0/... bundle (sha256 OK).
  • go test ./cmd/pilotctl/ ./internal/catalogue/ → all green.

🤖 Generated with Claude Code

…chines → io.pilot.smol

Renames the smolmachines app id to io.pilot.smol (rename + cloud upgrade) without
breaking existing installs. A hard delete would drop the app's publisher pin, and
the daemon supervisor fail-closes an installed app whose id has no pin — so instead
the old id becomes a hidden "tombstone" that redirects.

Catalogue (needs re-sign — see below):
- catalogue.json: replace the io.pilot.smolmachines entry with a minimal tombstone
  (id + publisher pin retained so existing installs keep running; renamed_to:
  io.pilot.smol; hidden). Drops the bundle/metadata — it is no longer installable.
- delete catalogue/apps/io.pilot.smolmachines/ (io.pilot.smol carries the app now).
- README: document the renamed_to + hidden fields and the rename procedure.

pilotctl (cmd/pilotctl):
- catalogueEntry gains optional renamed_to + hidden (omitempty; v2-compatible,
  older clients ignore them).
- resolveRenamed(): shared one-hop resolver that warns on stderr and returns the
  canonical entry. Wired into install (installs the canonical app), view (shows the
  renamed app), call (warns with a switch hint on a socket miss — it does not
  silently retarget, since the method namespace changes with the rename), and the
  catalogue listing (tombstone/hidden entries are omitted).
- appstore_rename_test.go: covers tombstone→canonical, plain id, missing canonical,
  and one-hop-only (no loop).

Verified end-to-end with a dev-signed catalogue: `catalogue` hides smolmachines,
`view`/`install io.pilot.smolmachines` warn and resolve to io.pilot.smol (install
fetched the io.pilot.smol bundle). All cmd/pilotctl tests pass except
TestLoadCatalogue_VerifiesSignedRepoCatalogue, which fails until catalogue.json.sig
is regenerated with the release key (I don't hold it):
  pilotctl appstore sign-catalogue --key <release.key> catalogue/catalogue.json

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Regenerates catalogue.json.sig over the tombstoned catalogue so it verifies
against the embedded catalogue anchor. TestLoadCatalogue_VerifiesSignedRepoCatalogue
and the full cmd/pilotctl suite are green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Alexgodoroja

Copy link
Copy Markdown
Collaborator Author

Superseded by #360, which bundles this change with the other three open catalogue PRs so the shared catalogue.json/catalogue.json.sig is signed and reviewed once instead of each merge invalidating the others. This PR's entry and files were taken verbatim into #360. Closing; not deleting the branch in case we need to reopen.

auto-merge was automatically disabled July 8, 2026 00:46

Pull request was closed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant